Bazel & gdb 基础

2017-07-31

学习使用bazel 和 gdb 调试程序

  • bazel: Google推出的一个代码调试工具, 比makefile用起来更简洁、方便。
  • gdb : GNU Project Debugger, 支持多种语言的代码调试。

    1. Bazel 基本概念:

  • bazel命令必须在一个包含WORKSPACE的路径下发生,如果没有可以新建一个空的WORKSPACE。
  • 在这个路径下的任意子路径里执行bazel命令都可以。
  • BUILD 文件里定义了一些rules,每条rule告诉bazel编译某个.cc源文件需要依赖哪些文件:deps,编译生成的可执行文件是什么:name,诸如此类。

    2.Bazel 查看依赖Graph:

    当项目包含多个pakages时,可以查看不同文件夹下各个源文件之间的依赖关系,一目了然:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 栗子来源于Bazel官方教程:
    https://docs.bazel.build/versions/master/tutorial/cpp.html
    # 生成依赖信息
    bazel query --nohost_deps --noimplicit_deps 'deps(//main:hello-world)' \
    --output graph
    # 把生成的内容(eg. 如下)复制到:http://www.webgraphviz.com/
    digraph mygraph {
    node [shape=box];
    "//main:hello-world"
    "//main:hello-world" -> "//main:hello-greet"
    "//main:hello-world" -> "//main:hello-world.cc"
    "//main:hello-world" -> "//lib:hello-time"
    "//main:hello-world.cc"
    "//main:hello-greet"
    "//main:hello-greet" -> "//main:hello-greet.cc\n//main:hello-greet.h"
    "//main:hello-greet.cc\n//main:hello-greet.h"
    "//lib:hello-time"
    "//lib:hello-time" -> "//lib:hello-time.cc\n//lib:hello-time.h"
    "//lib:hello-time.cc\n//lib:hello-time.h"
    }
    # 即可看到文件之间的依赖关系图

3. build

1
2
3
4
# 它所依赖的都文件会一起被build,所以一般build main函数所在的文件
bazel build //main:hello-world # //path:name
# cd 到WORKSPACE所在目录下可以看到多了几个以bazel-打头的文件夹(其实是软链接,不在这个文件夹下的)
# bazel-bin 里是编译生成的可执行文件。

4. debug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 要用gdb调试的话,需要在build时加参数: -c dbg 意思是:--config debug, 这样就会build时加上debug所需要的信息
bazel build -c dbg //main:hello-world
# 进入调试模式
gdb
# 载入可执行文件
file bazel-bin/hello-world
# 添加断点
b /lib/hello-time.cc : 6
b /main/hello-world.cc : 10
# 查看断点
info b
# 查看断点附近的代码
list /main/hello-world.cc : 10
# 运行
r
# 带参数运行
r amy
# 直接运行到下一个断点
c
# 打印变量
p var_name
# 执行下一行
n
# 执行下一行,step into 函数
s
# 查看堆栈
bt
# 结束调试
q